package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

//通过这个类，封装blog表增删改查
public class BlogDao {
    //1.新建一个博客
    //2.调用insert时候，需要先构造一个Blog对象
    //作为参数传递给insert,再由insert内部完成数据库的插入操作
    public  void  insert(Blog blog)  {
        Connection connection=null;
        PreparedStatement statement=null;
        try{
        //和数据库建立连接
         connection= DBUtil.getConnection();
        //2.构造SQL语句
        //此时博客发布时间，正好是执行SQL的时候，这时候直接使用SQL里的now()库函数，完成获取当前时间工作
        String sql="insert into blog values(null,?,?,?,now())";
        statement= connection.prepareStatement(sql);
        statement.setString(1, blog.getTitle());
        statement.setString(2,blog.getContent());
        statement.setInt(3,blog.getUserId());
        //3.执行SQL语句
        statement.executeUpdate();
    }  catch (SQLException e) {
        e.printStackTrace();
    }
        finally {
            //4.关闭连接，释放资源
            DBUtil.close(connection,statement,null);

        }
        }
        //2.查询blog表里面所有的博客
    //正常开发，也肯定不会把表里面整个数据都查询出来，一般都是要制定筛选条件/最大条数的
    //此处我们先不去考虑这么多，直接简单粗暴全部查询就可以了。
    public List<Blog> getBlogs(){
        Connection connection=null;
        PreparedStatement statement=null;
        ResultSet resultSet=null;
        List<Blog>blogs=new ArrayList<>();
        try{
            //1.和数据库建立连接
            connection= DBUtil.getConnection();
            //2.构造SQL语句,如果不指定order by查询的顺序是不可预期的。
            //时间戳有问题，他的格式不对，我们要判断是后端返回到就是时间戳，还是说后端返回的格式化时间，前端显示的时候显示成了时间戳
            String sql="select *from blog order by postTime desc";
            statement= connection.prepareStatement(sql);
            //3.执行SQL
             resultSet =statement.executeQuery();
            //4.遍历结果集合
            while (resultSet.next()){
                Blog blog=new Blog();
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                blog.setContent(resultSet.getString("content"));
                blog.setUserId(resultSet.getInt("userId"));
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                blogs.add(blog);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            DBUtil.close(connection,statement,resultSet);
        }
        //如果前面的查询出现问题，blogs就会得到空的List
        return blogs;
    }
        //3.制定blogId,查询某一个博客
    public Blog getBlog(int blogId) {
        Connection connection=null;
        PreparedStatement statement=null;
        ResultSet resultSet=null;
        try{
            connection= DBUtil.getConnection();
            String sql="select * from blog where blogId =?";
            statement=connection.prepareStatement(sql);
            statement.setInt(1,blogId);
            resultSet=statement.executeQuery();
            //由于此处是按照blogId来查询，blogId又是主键，查询到的结果要不是1条记录，要不就没有
            //所以，此处就没有必要去循环了，直接条件判定就可以
            if(resultSet.next()){
                Blog blog=new Blog();
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                blog.setContent(resultSet.getString("content"));
                blog.setUserId(resultSet.getInt("userId"));
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                return blog;
            }
        }catch (SQLException throwables){
            throwables.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,resultSet);
        }
        return null;
    }
    //4.制定博客进行删除
    public  void delete(int blogId){
        Connection connection=null;
        PreparedStatement statement=null;
        try{
            connection =DBUtil.getConnection();
            String sql="delete from blog where blog=?";
            statement=connection.prepareStatement(sql);
            statement.setInt(1,blogId);
            statement.executeUpdate();

        }catch (SQLException throwables){
            throwables.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,null);
        }
      //修改博客这样的操作，此处暂时不涉及，但是可以自己去实现，代码和上述差不多
    }
}
